/**
 * @description 校验是否是十六进制颜色
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isHexColor(value)
 */
export function isHexColor(value) {
    return /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/.test(value);
}

/**
 * @description 校验是否是邮箱
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isEmail(value)
 */
export function isEmail(value) {
    return /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/.test(
        value);
}

/**
 * @description 校验是否是电话号码
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isPhoneNo(value)
 */
export function isPhoneNo(value) {
    return /^1[3-9]\d{9}$/.test(value);
}

/**
 * @description 校验是否是URL格式
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isUrl(value)
 */
export function isUrl(value) {
    return /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?/.test(value);
}

/**
 * @description 校验是否是日期格式
 * @param {String|Date} value 校验内容
 * @return {Boolean}
 * @example isDate(value)
 */
export function isDate(value) {
    return !/Invalid|NaN/.test(new Date(value).toString());
}

/**
 * @description 校验是否是ISO类型的日期格式
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isDateISO(value)
 */
export function isDateISO(value) {
    return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value);
}

/**
 * @description 校验是否是整数
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isDigits(value)
 */
export function isDigits(value) {
    return /^\d+$/.test(value);
}

/**
 * @description 校验是否是身份证号码
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isIdCard(value)
 */
export function isIdCard(value) {
    return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value);
}

/**
 * @description 校验是否是车牌号
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isCarNo(value)
 */
export function isCarNo(value) {
    // 新能源车牌
    const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
    // 旧车牌
    const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
    if (value.length === 7) {
        return creg.test(value);
    } else if (value.length === 8) {
        return xreg.test(value);
    } else {
        return false;
    }
}

/**
 * @description 校验是否是金额 两位小数
 * @param {String|Number} value 校验内容
 * @return {Boolean}
 * @example isAmount(value)
 */
export function isAmount(value) {
    return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value);
}

/**
 * @description 校验是否是中文
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isChinese(value)
 */
export function isChinese(value) {
    let reg = /^[\u4e00-\u9fa5]+$/gi;
    return reg.test(value);
}

/**
 * @description 校验是否是字母
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isLetter(value)
 */
export function isLetter(value) {
    return /^[a-zA-Z]*$/.test(value);
}

/**
 * @description 校验是否是数字
 * @param {String|Number} value 校验内容
 * @return {Boolean}
 * @example isNumber(value)
 */
export function isNumber(value) {
    return /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value);
}

/**
 * @description 校验是否是字母或者数字
 * @param {String|Number} value 校验内容
 * @return {Boolean}
 * @example isLetterOrNumber(value)
 */
export function isLetterOrNumber(value) {
    let reg = /^[0-9a-zA-Z]*$/g;
    return reg.test(value);
}

/**
 * @description 校验是否包含某个值
 * @param {String} value 校验内容
 * @param {String|Number} param 包含内容
 * @return {Boolean}
 * @example isContains(value, param)
 */
export function isContains(value, param) {
    return value.indexOf(param) >= 0;
}

/**
 * @description 校验值大小是否在范围内
 * @param {String|Number} value 校验内容
 * @param {Array} array 值范围 tips: [0,10]
 * @return {Boolean}
 * @example isInRange(value, array)
 */
export function isInRange(value, array) {
    return value >= array[0] && value <= array[1];
}

/**
 * @description 校验值长度是否在范围内
 * @param {String} value 校验内容
 * @param {Array} array 长度范围 tips: [0,10]
 * @return {Boolean}
 * @example isInRangeLength(value, array)
 */
export function isInRangeLength(value, array) {
    return value.length >= array[0] && value.length <= array[1];
}

/**
 * @description 校验是否是固定电话
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isLandline(value)
 */
export function isLandline(value) {
    let reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/;
    return reg.test(value);
}

/**
 * @description 校验是否是验证码
 * @param {String|Number} value 校验内容
 * @param {String|Number} len 验证码长度
 * @return {Boolean}
 * @example isCode(value, len)
 */
export function isCode(value, len = 6) {
    return new RegExp(`^\\d{${len}}$`).test(value);
}

/**
 * @description 校验是否字符串
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isString(value)
 */
function isString(value) {
    return typeof value === 'string'
}

/**
 * @description 校验是否是数组
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isArray(value)
 */
export function isArray(value) {
    if (typeof Array.isArray === "function") {
        return Array.isArray(value);
    } else {
        return Object.prototype.toString.call(value) === "[object Array]";
    }
}

/**
 * @description 校验是否是对象
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isObject(value)
 */
export function isObject(value) {
    return Object.prototype.toString.call(value) === "[object Object]";
}

/**
 * @description 校验是否是Json字符串
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isJsonString(value)
 */
export function isJsonString(value) {
    if (typeof value == "string") {
        try {
            var obj = JSON.parse(value);
            if (typeof obj == "object" && obj) {
                return true;
            } else {
                return false;
            }
        } catch (e) {
            return false;
        }
    }
    return false;
}

/**
 * @description 校验是否为空
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isEmpty(value)
 */
export function isEmpty(value) {
    switch (typeof value) {
        case "undefined":
            return true;
        case "string":
            if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, "").length == 0) return true;
            break;
        case "boolean":
            if (!value) return true;
            break;
        case "number":
            if (0 === value || isNaN(value)) return true;
            break;
        case "object":
            if (null === value || value.length === 0) return true;
            for (var i in value) {
                return false;
            }
            return true;
    }
    return false;
}

/**
 * @description 校验是否函数方法
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isFunction(value)
 */
export function isFunction(value) {
    return typeof value === 'function'
}

/**
 * @description 校验是否promise对象
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isPromise(value)
 */
export function isPromise(value) {
    return object(value) && func(value.then) && func(value.catch)
}

/**
 * @description 校验是否图片格式
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isImage(value)
 */
export function isImage(value) {
    const newValue = value.split('?')[0]
    const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i
    return IMAGE_REGEXP.test(newValue)
}

/**
 * @description 校验是否视频格式
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isVideo(value)
 */
export function isVideo(value) {
    const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i
    return VIDEO_REGEXP.test(value)
}

/**
 * @description 校验是否为正则对象
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isRegExp(value)
 */
export function isRegExp(value) {
    return value && Object.prototype.toString.call(value) === '[object RegExp]'
}

export default {
    isHexColor,
    isEmail,
    isPhoneNo,
    isUrl,
    isDate,
    isDateISO,
    isDigits,
    isIdCard,
    isCarNo,
    isAmount,
    isChinese,
    isLetter,
    isNumber,
    isLetterOrNumber,
    isContains,
    isInRange,
    isInRangeLength,
    isLandline,
    isCode,
    isString,
    isArray,
    isObject,
    isJsonString,
    isEmpty,
    isFunction,
    isPromise,
    isImage,
    isVideo,
    isRegExp,
}
